/****************************************************************************
 * Copyright 2010 Huascar A. Sanchez                                        *
 *                                                                          *
 * Licensed under the Apache License, Version 2.0 (the "License");          *
 * you may not use this file except in compliance with the License.         *
 * You may obtain a copy of the License at                                  *
 *                                                                          *
 *     http://www.apache.org/licenses/LICENSE-2.0                           *
 *                                                                          *
 * Unless required by applicable law or agreed to in writing, software      *
 * distributed under the License is distributed on an "AS IS" BASIS,        *
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
 * See the License for the specific language governing permissions and      *
 * limitations under the License.                                           *
 ****************************************************************************/
package com.gotobject.greatq;

/**
 * @author huascar.sanchez@gmail.com (Huascar A. Sanchez)
 */
public abstract class AbstractModule implements Module {
    QuerySubmitter submitter;

    @Override
    public synchronized void configure(QuerySubmitter submitter) {
        try {
          if (this.submitter != null) {
            throw new IllegalStateException("Re-entry is not allowed.");
          }
          this.submitter = nonNull(submitter, "submitter");
          configure();
        } finally {
          this.submitter = null;
        }
    }

    protected abstract void configure();

    protected QuerySubmitter submitter(){
        return submitter;
    }


    protected void addError(Throwable cause) {
        submitter().addError(cause);
    }

    protected void addError(String message) {
        submitter().addError(message);
    }
    
    protected void install(Module module) {
        submitter().install(module);
    }
    
    protected QuerySubmissionBuilder submitBatch(String... sqls) {
        return submitter().submitBatch(sqls);
    }


    protected QuerySubmissionBuilder submit(String sql){
        return submitter().submit(sql);
    }


    /**
     * Detects null values.
     *
     * @param t value
     * @param message to display in the event of a null
     * @return t
     */
    public static <T> T nonNull(T t, String message) {
      if (t == null) {
        throw new NullPointerException(message);
      }
      return t;
    }

}
